/*
 * Copyright (c) 2015—2030 GantSoftware.Co.Ltd. All rights reserved.
 *  <p>
 *  Unless required by applicable law or agreed to in writing, software
 *  is not allowed to be distributed or copied without the license from
 *  GantSoftware.Co.Ltd. Please contact the company for more information.
 */
package com.gantang.gax.engine.service;

import com.gantang.gax.engine.model.VariableGroup;

import java.math.BigInteger;
import java.util.List;

/**
 * 引擎服务
 */
public interface EngineService {
    /**
     * 加载引擎
     *
     * @return
     */

    default Boolean reload() {
        return true;
    }

    /**
     * 卸载引擎，释放内存
     *
     * @return
     */

    default Boolean unLoad() {
        return true;
    }

    /**
     * 重置引擎 针对不支持并发的引擎
     * 有些引擎（CXD）支持并发，无需重置
     *
     * @return
     */
    default void reset() {
    }

    /**
     * 销毁引擎，释放内存
     *
     * @return
     */
    default Boolean destory() {
        return true;
    }

    /**
     * 根据输入的外部变量值编码列表，依次列出每个家族下可选的特征值清单
     *
     * @param variables 输入的外部变量值编码列表
     * @return 符合当前约束规则条件下可选的变量值编码列表
     */
    default List<VariableGroup> findAllSelectableVariables(List<String> variables) {
        return findAllSelectableVariables(variables, null);
    }

    /**
     * 根据输入的外部变量值编码列表，依次列出每个家族下可选的特征值清单
     *
     * @param variables  输入的外部变量值编码列表
     * @param groupCodes 限定的 groupCode 列表，用于限制查询范围
     * @return 符合当前约束规则条件下可选的变量值编码列表
     */
    default List<VariableGroup> findAllSelectableVariables(List<String> variables, List<String> groupCodes) {
        return null;
    }

    /**
     * 最快找到一个满足约束规则的变量值排列组合
     *
     * @return
     */
    default List<String> findOneSolution() {
        return null;
    }

    /**
     * 根据权重，找到最适合一个满足约束规则的变量值排列组合
     *
     * @return
     */
    default List<String> findBestSolution() {
        return findBestSolution(null);
    }

    /**
     * 根据权重，找到最适合一个满足约束规则的变量值排列组合
     *
     * @param variables 输入的外部变量值编码列表
     * @return
     */
    default List<String> findBestSolution(List<String> variables) {
        return findBestSolution(variables, false);
    }

    /**
     * 根据权重，找到最适合一个满足约束规则的变量值排列组合
     *
     * @param variables           输入的外部变量值编码列表
     * @param recommendOnConflict 当存在矛盾是否推荐
     * @return
     */
    default List<String> findBestSolution(List<String> variables, Boolean recommendOnConflict) {
        return List.of();
    }


    /**
     * 找到所有满足约束规则的变量值排列组合，限制返回数量
     *
     * @param limitCount 限制最大的数量，超过则不返回
     * @return 所有满足约束规则的变量值排列组合
     */
    default List<List<String>> findAllSolutions(int limitCount) {
        return null;
    }


    /**
     * 返回符合条件的解总数量
     * 当超过
     *
     * @return
     */
    default BigInteger solutionCount() {
        return solutionCount(null);
    }

    /**
     * 返回符合条件的解总数量
     *
     * @param variables 输入的外部变量值编码列表
     * @return
     */
    default BigInteger solutionCount(List<String> variables) {
        return BigInteger.ZERO;
    }
}
